package feri.lenobe;

import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.*;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
//niko koda
import java.util.ArrayList;
import java.util.List;
//drew koda
import com.google.api.translate.Language;
import com.google.api.translate.Translate;



public class PrevodRisanje extends GraphicsActivity  
	implements ColorPickerDialog.OnColorChangedListener  {	 
	
	 public class posameznZnak
	 {
		 char znak;
		 List<PointF> vektorjiz;
	 }
	 private char[] crke = {'A','C','T','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9', ' '};
	
	//Nastavitve
 	public SharedPreferences settings;
	public Editor editor;
	private float HitrostUcenja;
	private int StVhodnihN;
	private int StSkritihN;
	private float DovoljenaNapaka;
	private boolean JeNaucenaMreza;
	
	//GUI
	private MyView risanjeView;
	private TextView mTextViewBesedilo;
	private Button btnPrevedi;
	private Button btnBackspace;
	private String Besedilo="";
	private int kolicinaVpisanih = 0;
	
	//Prevajanje
	private enum JezikPrevoda
	{
		AUTO, Slovenscina, Anglescina;
	}
	@SuppressWarnings("deprecation")
	public String Prevedi(JezikPrevoda izJezika, JezikPrevoda vJezik, String besedilo)
	{
		Translate.setHttpReferrer("https://sites.google.com/site/pessimistdrew");
		String prevedeno="";
		try {
			prevedeno = Translate.translate(besedilo, Language.ENGLISH, Language.SLOVENIAN);
		} catch (Exception e) {
			e.printStackTrace();
			return e.getMessage();
		}		
		return prevedeno;
	}
	
	//Mreža
	private NevronskaMreza NMreza;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        risanjeView = new MyView(this);
        setContentView(risanjeView);
        LinearLayout ll= new LinearLayout(risanjeView.getContext());
        LinearLayout ll2= new LinearLayout(risanjeView.getContext());
        ll2.setOrientation(LinearLayout.HORIZONTAL);
        ll.setOrientation(LinearLayout.VERTICAL);
        RelativeLayout.LayoutParams params;
        
        params = new RelativeLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        mTextViewBesedilo = new TextView(risanjeView.getContext());
        mTextViewBesedilo.setText("");
        mTextViewBesedilo.setTextSize(20.0f);
        mTextViewBesedilo.setBackgroundColor(Color.BLACK);
        mTextViewBesedilo.requestFocus();
        mTextViewBesedilo.layout(0, 1, 1, 0);
        params = new RelativeLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT );
        mTextViewBesedilo.setLayoutParams(params);
        ll.addView(mTextViewBesedilo/*, mTextViewBesedilo.getLayoutParams()*/);    
        
        
        params = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        btnPrevedi = new Button(risanjeView.getContext());
        btnPrevedi.setText("Dodaj znak");
        btnPrevedi.setEnabled(false);
        btnPrevedi.setOnClickListener(new View.OnClickListener() {
        	public void onClick(View arg0) 
        	{
        		if(JeNaucenaMreza)
        		{
	        		if(Besedilo.length()>0)
	        		{
	        			String temp = Prevedi(null, null, Besedilo);
	        			mTextViewBesedilo.setText("Prevod: "+temp);
	        			kolicinaVpisanih = 0;
	        		}
	        		else
	        		{
	        			Toast.makeText(getApplicationContext(), "Prazno besedilo, prosim vnesite besedilo za prevod!", 2000).show();
	        		}
        		}
        		else
        		{
        			if(counter == 0)
                    {
            			risanjeView.PocistiPovrsino();
            			//item.setTitle("Naslednji znak");
            			btnPrevedi.setEnabled(true);
            			ucenjeZnakov();
            			JeNaucenaMreza = false;
            			//TODO shrani nastavitev
                    }
                    else if( counter == 2 && !seznamtock.isEmpty())//TODO spremenit na 36
                    {
	                    //item.setTitle("Začni Učenje mreže");
	                    stvektorjev();
	                    posameznZnak znakec = new posameznZnak();
	                    znakec.znak = crke[counter-1];
	                    znakec.vektorjiz = new ArrayList<PointF>(vektorji);
	                    vsecrke.add(znakec);
	                    risanjeView.PocistiPovrsino();
	                    ucenjeZnakov();                   
                    }
                    else if(counter == 3 && !seznamtock.isEmpty()) //TODO Spremenit na 37
                    {
	                    stvektorjev();
	                    posameznZnak znakec = new posameznZnak();
	                    znakec.znak = crke[counter-1];
	                    znakec.vektorjiz = new ArrayList<PointF>();
	                    znakec.vektorjiz = vektorji;
	                    vsecrke.add(znakec);
	                    risanjeView.PocistiPovrsino();
	                    mTextViewBesedilo.setText("Učim mrežo...");
	                    //Učenje mreže
	                    NMreza = new NevronskaMreza(HitrostUcenja, StSkritihN, DovoljenaNapaka);
	                    NMreza.Nauci(vsecrke);
	                    NMreza.Shrani();
	                    
	                    //Posodobimo nastavitve
	                    JeNaucenaMreza = true;
	                    editor.putBoolean("JeNaucenaMreza", true);
	                    editor.commit();
	                    
	                    mTextViewBesedilo.setText("");
	                    btnPrevedi.setText("Prevedi");
	                    //item.setTitle("Nauči");
	                    counter = 0;
	                    kolicinaVpisanih = 0;
                    }
                    else
                    {
                    	if(!seznamtock.isEmpty())
                    	{
		                    stvektorjev();
		                    posameznZnak znakec = new posameznZnak();
		                    znakec.znak = crke[counter-1];
		                    znakec.vektorjiz = new ArrayList<PointF>();
		                    znakec.vektorjiz = vektorji;
		                    vsecrke.add(znakec);
		                    risanjeView.PocistiPovrsino();
		                    ucenjeZnakov();
                    	}
                    }
        		}
        	}
        });
        btnPrevedi.setLayoutParams(params);
        ll2.addView(btnPrevedi/*, params*/);    
        
        //ll.forceLayout();
        btnBackspace = new Button (risanjeView.getContext());
        btnBackspace.setText("←");
        btnBackspace.setOnClickListener(new View.OnClickListener() {
        	public void onClick(View arg0) 
        	{
        		if(Besedilo.length()>0)
        		{
        			String temp = Besedilo.substring(0, --kolicinaVpisanih);
        			mTextViewBesedilo.setText(temp);
        		}
        		else
        		{
        			Toast.makeText(getApplicationContext(), "Prazno besedilo!", 700).show();
        		}
        	}
        });
        btnBackspace.setLayoutParams(params);
        ll2.addView(btnBackspace/*,params*/);
        ll.addView(ll2);
        params = new RelativeLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        this.addContentView(ll, params);
        
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(0xFFFF0000);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12); 

        mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 },
                                       0.4f, 6, 3.5f);

        mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);
        
        //Preberemo nastavitve
        pridobiNastavitve();
        
    }

    private Paint mPaint;
    private MaskFilter mEmboss;
    private MaskFilter mBlur;
    
    //niko koda
    public List<PointF> seznamtock = new ArrayList<PointF>();
    public List<PointF> vektorji = new ArrayList<PointF>();
    public PointF tocka = new PointF();
    public int spremenljivka = 15;
    public List<posameznZnak> vsecrke = new ArrayList<posameznZnak>();
    public int counter = 0;
    
    private void ucenjeZnakov()
    {
    	if(counter!=36)
    		mTextViewBesedilo.setText("Vpiši znak "+ crke[counter]);
    	else
    		mTextViewBesedilo.setText("Vpiši presledek");
     counter++;
    }
    
    //
    //niko koda
    //normalizacija in spremembe v vektor vektor = točka2-točka1
    private void normalizacija()
    {
    	vektorji.clear();
    	int k = 0;
        for(int i = 0; i<=spremenljivka-1; i++)//15 krat za vsak vektor
		{
        	int j = i;
        	j = j+k;
			do
			{
				if(seznamtock.get(j+1).x == -1000 && seznamtock.get(j+1).y == -1000)//če je presledek gre na naslednjo
				{
					k = k+2;
					j = i+k;
					
				}
				else
				{
					PointF vektor = new PointF(seznamtock.get(j+1).x-seznamtock.get(j).x,seznamtock.get(j+1).y-seznamtock.get(j).y);//spremeni v vektor
					double dolzina = Math.sqrt(Math.pow(vektor.x,2)+Math.pow(vektor.y, 2));
					tocka = new PointF();
					tocka.x = vektor.x/(float)dolzina;
					tocka.y = vektor.y/(float)dolzina;
					vektorji.add(tocka);//normalizira in doda v vektorji
					break;
				}
			}while (1 == 1);
		}
		seznamtock.clear();
    }
    //dolzina med dvema tockama
    private double dolzinav(PointF prva, PointF druga)
    {
    	return Math.sqrt(Math.pow((druga.x - prva.x),2)+ Math.pow((druga.y - prva.y),2));
    }
    //uredi stevilo tock za vektorje
    private void stvektorjev()
    {
    	int z = 0;
    	//pogleda koliko je presledkov v risanju
    	for(int i = 0; i< seznamtock.size()-1; i++)
    	{
    		if(seznamtock.get(i).x == -1000 && seznamtock.get(i).y == -1000)
    		{
    			z++;//prešteje število presledkov
    		}
    	}
    	//pogleda če je dovolj točk
    	if(spremenljivka+1 < seznamtock.size()-1-(z*2))//preveliko ali točno število točk za vektorje
    	{
    		do
    		{
    			//pogleda kolko je prva dolzina, ki jo lahko zamenja torej druga razdalja
				double min = dolzinav(seznamtock.get(1), seznamtock.get(2));
				int i1 = 0;
				for(int i = 2; i< seznamtock.size()-2; i++)//gleda od točke 2,3 do st-2,st-1 (zadnja je -1000)
				{
					if(seznamtock.get(i+2).x == -1000 && seznamtock.get(i+2).y == -1000)//pogleda če je preslek
					{
						i +=4;//če je presledek se i poveča za 4 ker spusti tiste razdalje, ki jih ne sme spremenit
						break;
					}
					else if(dolzinav(seznamtock.get(i),seznamtock.get(i+1))< min)//pogleda, če je najmanjša če ni zamenja
					{
						min = dolzinav(seznamtock.get(i),seznamtock.get(i+1));
						i1 = i;
					}
				}
				//nova toča, ki je sredina med najkrajšo razdaljo
				PointF nova = new PointF((seznamtock.get(i1).x+seznamtock.get(i1+1).x)/2,(seznamtock.get(i1).y+seznamtock.get(i1+1).y)/2);
				seznamtock.remove(i1);
				seznamtock.remove(i1);
				seznamtock.add(i1, nova);//zbriše prejšnji in doda novo
    		}while(spremenljivka+1 != seznamtock.size()-1-(z*2));//dela dokler ni natančno 15 vektorjev
    		normalizacija();
    	}
    	else if(spremenljivka > seznamtock.size()-1-(z*2))//premalo točk za vektorje
    	{
    		do
    		{
				double max = dolzinav(seznamtock.get(0), seznamtock.get(1));//začne s prvo razdaljo
				int i1 = 0;
				for(int i = 1; i< seznamtock.size()-2; i++)//izpusti samo razdaljo med predzadnjo in zadnjo točko
				{
					if(seznamtock.get(i+1).x == -1000 && seznamtock.get(i+1).y == -1000)//če je presledek ga spusti in nadaljuje
					{
						i +=2;
						break;
					}
					else if(dolzinav(seznamtock.get(i),seznamtock.get(i+1))> max)//pogleda če je najdaljša in potem zamenja
					{
						max = dolzinav(seznamtock.get(i),seznamtock.get(i+1));
						i1 = i;
					}
				}
				PointF nova = new PointF((seznamtock.get(i1).x+seznamtock.get(i1+1).x)/2,(seznamtock.get(i1).y+seznamtock.get(i1+1).y)/2);//nova točka na sredini in jo doda
				seznamtock.add(i1 + 1, nova);	
    		}while(spremenljivka+1 != seznamtock.size()-1-(z*2));//dokler ni točno število točk
    		normalizacija();
    	}
    }
    //

    public void colorChanged(int color) {
        mPaint.setColor(color);
    }

    public class MyView extends View {

        private static final float MINP = 0.25f;//0.25f
        private static final float MAXP = 0.75f;//0.75f
        
        
        private Bitmap  mBitmap;
        private Canvas  mCanvas;
        private Path    mPath;
        private Paint   mBitmapPaint;

        public MyView(Context c) {
            super(c);

            mPath = new Path();
            mBitmapPaint = new Paint(Paint.DITHER_FLAG);
        }
        
        public void PocistiPovrsino()
        {
        	int tempW = mBitmap.getWidth();
        	int tempH = mBitmap.getHeight();
            mBitmap = Bitmap.createBitmap(tempW, tempH, Bitmap.Config.ARGB_8888);
            mCanvas = new Canvas(mBitmap);
            seznamtock.clear();
            invalidate();
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            mCanvas = new Canvas(mBitmap);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawColor(0xFFAAAAAA);
            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
            canvas.drawPath(mPath, mPaint);
        }

        private float mX, mY;
        private static final float TOUCH_TOLERANCE = 4;

        private void touch_start(float x, float y) {
            mPath.reset();
            mPath.moveTo(x, y);
            mX = x;
            mY = y;
            tocka = new PointF(x,y);
            seznamtock.add(tocka);
        }
        //v tej funkciji vzamemo koordinate in jih dodamo v vektor
        private void touch_move(float x, float y) {
            float dx = Math.abs(x - mX);
            float dy = Math.abs(y - mY);
            if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
                mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
                mX = x;
                mY = y;
                //niko koda
                tocka = new PointF(x,y);
                seznamtock.add(tocka);
                
            }
        }
        private void touch_up(float x, float y) {
            mPath.lineTo(mX, mY);
            mCanvas.drawPath(mPath, mPaint);
            mPath.reset();
            tocka = new PointF(-1000,-1000);
            seznamtock.add(tocka);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getX();
            float y = event.getY();

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    touch_start(x, y);
                    invalidate();
                    break;
                case MotionEvent.ACTION_MOVE:
                    touch_move(x, y);
                    invalidate();
                    break;
                case MotionEvent.ACTION_UP:
                    touch_up(x, y);
                    invalidate();
                    break;
            }
            return true;
        }
        
        public void deletePath(int a){
        	a = 5;
        }
    }//END MyView

    private static final int BARVA_MENU_ID = Menu.FIRST;
    private static final int BRISI_MENU_ID = Menu.FIRST + 1;
    private static final int NAZAJ_MENU_ID = Menu.FIRST + 2;
    private static final int NAUCI_MENU_ID = Menu.FIRST + 3;
    private static final int PREPOZNAJ_MENU_ID = Menu.FIRST + 4;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.add(0, BARVA_MENU_ID, 0, "Barva").setShortcut('3', 'c');
        menu.add(0, BRISI_MENU_ID, 0, "Briši").setShortcut('4', 's');
       // menu.add(0, NAZAJ_MENU_ID, 0, "Nazaj").setShortcut('5', 'z');
        menu.add(0, NAUCI_MENU_ID, 0, "Nauci").setShortcut('5', 'z');
        menu.add(0, PREPOZNAJ_MENU_ID, 0, "Prepoznaj").setShortcut('5', 'z');
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        mPaint.setXfermode(null);
        mPaint.setAlpha(0xFF);

        switch (item.getItemId()) {
            case BARVA_MENU_ID:
                new ColorPickerDialog(this, this, mPaint.getColor()).show();
                return true;
            case BRISI_MENU_ID:
            	risanjeView.PocistiPovrsino();
                return true;
            case NAUCI_MENU_ID:
            	if(!JeNaucenaMreza)
            	{
            		if(counter == 0)
                    {
            			risanjeView.PocistiPovrsino();
            			item.setTitle("Naslednji znak");
            			btnPrevedi.setEnabled(true);
            			ucenjeZnakov();
            			JeNaucenaMreza = false;
            			//TODO shrani nastavitev
                    }
                    else if( counter == 2 && !seznamtock.isEmpty())//TODO spremenit na 36
                    {
	                    item.setTitle("Začni Učenje mreže");
	                    stvektorjev();
	                    posameznZnak znakec = new posameznZnak();
	                    znakec.znak = crke[counter-1];
	                    znakec.vektorjiz = new ArrayList<PointF>(vektorji);
	                    vsecrke.add(znakec);
	                    risanjeView.PocistiPovrsino();
	                    ucenjeZnakov();                   
                    }
                    else if(counter == 3 && !seznamtock.isEmpty()) //TODO Spremenit na 37
                    {
	                    stvektorjev();
	                    posameznZnak znakec = new posameznZnak();
	                    znakec.znak = crke[counter-1];
	                    znakec.vektorjiz = new ArrayList<PointF>();
	                    znakec.vektorjiz = vektorji;
	                    vsecrke.add(znakec);
	                    risanjeView.PocistiPovrsino();
	                    mTextViewBesedilo.setText("Učim mrežo...");
	                    //Učenje mreže
	                    NMreza = new NevronskaMreza(HitrostUcenja, StSkritihN, DovoljenaNapaka);
	                    NMreza.Nauci(vsecrke);
	                    NMreza.Shrani();
	                    
	                    //Posodobimo nastavitve
	                    JeNaucenaMreza = true;
	                    editor.putBoolean("JeNaucenaMreza", true);
	                    editor.commit();
	                    
	                    mTextViewBesedilo.setText("");
	                    btnPrevedi.setText("Prevedi");
	                    item.setTitle("Nauči");
	                    counter = 0;
                    }
                    else
                    {
                    	if(!seznamtock.isEmpty())
                    	{
		                    stvektorjev();
		                    posameznZnak znakec = new posameznZnak();
		                    znakec.znak = crke[counter-1];
		                    znakec.vektorjiz = new ArrayList<PointF>();
		                    znakec.vektorjiz = vektorji;
		                    vsecrke.add(znakec);
		                    risanjeView.PocistiPovrsino();
		                    ucenjeZnakov();
                    	}
                    }
            	}
            	else
            	{
            		Toast.makeText(this, "Mreža je že naučena! Če želite mrežo naučiti znova jo prosim ponastavite v nastavitvah.", 2000).show();
            	}
                return true;
            case PREPOZNAJ_MENU_ID:
            	if(JeNaucenaMreza)
            	{
            		stvektorjev();
            		String tmp = Character.toString(crke[NMreza.Razpoznaj(vektorji)]);
            		String tmp2 = mTextViewBesedilo.getText().toString();
            		Besedilo+=tmp;
            		mTextViewBesedilo.setText(tmp2+tmp);
            		risanjeView.PocistiPovrsino();
            		kolicinaVpisanih++;
            	}
            	else
            	{
            		Toast.makeText(this, "Prepoznava ni možna! Mreža še ni naučena.", 2000).show();
            	}
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
    
    public void pridobiNastavitve()
    {
    	String PREFS_NAME = "NastavitvePrevajalca";

    	settings = getSharedPreferences(PREFS_NAME, 0);
    	editor = settings.edit();
        boolean UseDeafault = settings.getBoolean("privzeteVrednosti", true);
        
        if(UseDeafault)
        {
        	HitrostUcenja = 0.20f;
        	StSkritihN = 5;
        	DovoljenaNapaka = 0.05f;
        	JeNaucenaMreza = false;
        }
        else
        {
        	HitrostUcenja = settings.getFloat("hitrostUcenja", 0.25f);
        	StSkritihN = settings.getInt("StSkritihN",7);
        	DovoljenaNapaka = settings.getFloat("dovoljenaNapaka", 0.1f);
        	JeNaucenaMreza = settings.getBoolean("JeNaucenaMreza",false);
        }
    }
}